Amazon Linux 2 の Dockerイメージから開発環境を作り Visual Studio Codeで接続してみる
Amazon Linux 2のDockerイメージから開発環境として使うコンテナを作り、Visual Studio Codeで接続してみました。 コンテナは以下をインストール or 可能としてみました。
- AWS CLIをインストールする。かつクレデンシャルはローカルのものをコンテナ内でも使えるようにする。
- (開発言語として)Go言語をインストールする。
- ローカルマシンとコンテナで共有できるフォルダを作成する。
以下、今回作成した「docker-compose.yml」と「Dockerfile」について書いていきたいと思います。
作成したもの
ローカル環境について
本作業はMacで行いました。docker-composeとDockerがインストールされているものとします。docker-composeとDocker、Visual Studio Codeがインストールされているものとします。
Visual Studio Codeについては、コンテナに接続するためのRemote Containerをインストールしておいてください。
ローカルにAWSに接続可能なクレデンシャルがあるものとします。
フォルダ構成について
ローカルマシンのフォルダ内に、「docker-compose.yml」と「Dockerfile」、それとコンテナと共有するための「share」フォルダを作成します。構成としては以下のようになります。
. ├── Dockerfile ├── docker-compose.yml └── share/
docker-compose.yml と Dockefileについて
「docker-compose.yml」は以下のようになりました。
version: "3.7" services: amzn-linux-2: build: . container_name: amzn-linux-2 privileged: true restart: always volumes: - type: bind source: ./share target: /share - type: bind source: ~/.aws target: /home/ec2-user/.aws
「docker-compose.yml」ではクレデンシャルをコンテナと共有するため、9行目からの「volumes」にてローカルの「~/.aws」フォルダをコンテナとbindしています。またローカルの「share」フォルダをコンテナと共有するため、こちらも「volumes」にてbindするよう定義しています。 コンテナ名は「amzn-linux-2」としてみました。
「Dockerfile」は以下のようになりました。
FROM amazonlinux:2 # install amazon-linux-extras install RUN amazon-linux-extras install -y # yum update & install RUN yum update -y \ && yum install \ systemd \ tar \ unzip \ sudo \ -y # install aws cli v2 RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \ && unzip awscliv2.zip \ && sudo ./aws/install # create user RUN useradd "ec2-user" && echo "ec2-user ALL=NOPASSWD: ALL" >> /etc/sudoers # install for develop, etc. RUN sudo amazon-linux-extras install golang1.11 -y # init CMD ["/sbin/init"]
「Dockerfile」の1行目では、タイトルの書いたようにAmazon Linux 2 の Dockerイメージを使うため、「FROM amazonlinux:2」を記載しています。
4行目の「RUN amazon-linux-extras install -y」ですが、開発環境用ということで「amazon-linux-extras」をインストールしてみました。「amazon-linux-extras」を入れると、さまざまなパッケージをamazon-linux-extrasを使ってインストールすることができます。今回もこの後で書くGo言語のインストールで使用しています。 「amazon-linux-extras」については、以下も参考にしてみてください。
Amazon Linux 2のExtras Library(amazon-linux-extras)を使ってみた
7・8行目からのyum installでは、今回必要だったものをyumを使ってインストールしています。案件によっては、wgetなど必要なものをここに追加してもいいと思います。
16行目では aws cli v2をインストールしています。
21行目では、作業用ユーザとして「ec2-user」を作成しています。このユーザ名は案件によって適宜変えてもいいかと思います。
24行目では、「amazon-linux-extras」を使いGo言語をインストールしています。ここも案件によっては違う言語を指定 or 必要なものをインストールすることになるかと思います。
コンテナを起動してVisual Studio Codeで接続してみる
「docker-compose.yml」と「Dockerfile」があるフォルダにて以下のコマンドを実行します。
$ docker-compose up -d
「docker ps」コマンドを叩き、「amzn-linux-2」のコンテナが動いていることを確認します。次にVisual Studio Codeを開き、コマンドパレットより「Remote-Containers: Attach to Runnning Container...」を選択します。動いているコンテナの一覧が表示されるので、起動した「amzn-linux-2」を選択します。
Remote Containerで接続できたら、Visual Studio Codeのターミナルを開きます。色々作業はできるかと思いますが、今回は「docker-compose.yml」「Dockerfile」にて設定やインストールしたものが使えるかを確認してみました。
まずユーザを「ec2-user」にしてみます。
$ su - ec2-user [ec2-user@xxxxxxxxxxxx ~]$ pwd /home/ec2-user
次にaws cliです。ターミナルにて以下のように入力し、aws cliのバージョンが表示されること、任意のクレデンシャル(以下の例では「sample」)で「aws s3 ls」コマンドが実行できることを確認してみます。
[ec2-user@xxxxxxxxxxxx ~]$ aws --version aws-cli/2.2.30 Python/3.8.8 Linux/5.10.25-linuxkit exe/x86_64.amzn.2 prompt/off [ec2-user@xxxxxxxxxxxx ~]$ aws s3 ls --profile sample ...(存在するS3バケットが表示される)
Go言語についても確認してみます。ローカルとの共有フォルダ「/share」に「src」フォルダを作り、そこに簡単なGo言語のプログラムを書いて実行してみます。
[ec2-user@xxxxxxxxxxxx ~]$ go version go version go1.15.14 linux/amd64 [ec2-user@xxxxxxxxxxxx ~]$ mkdir /share/src [ec2-user@xxxxxxxxxxxx ~]$ touch /share/src/sample.go
Go言語のプログラム「sample.go」は以下のようにしてみました。
package main import "fmt" func main() { fmt.Println("ok") }
「sample.go」を作成したら、「go run」にて実行してみます。
[ec2-user@xxxxxxxxxxxx ~]$ go run /share/src/sample.go ok
Go言語のプログラムが実行できることが確認できました。最後に、作成した「sample.go」がローカルの「share/src」フォルダに存在していて、コンテナと共有されていることを確認してください。
まとめ
今後よく使うであろうツール & 言語を入れたコンテナを作成してみました。案件のよってコンテナにインストールするものを変えることで、ローカルに色々インストールすることなく開発環境を構築できるのではないかと思います。 何かの役に立てば幸いです。
参考サイト
追記
以下の記事で作業用ユーザで接続してVisual Studio Codeでデバッグすることについて追加しました。
[小ネタ][Visual Studio Code]Dockerイメージの開発環境に作業用ユーザで接続する & Go言語でリモートデバッグをしてみる